#ifndef __DUIPLUS_CLIENT_H__
#define __DUIPLUS_CLIENT_H__

#ifdef __cplusplus
extern "C" {
#endif


#if (!(defined DUIPLUS_CALL) || !(defined DUIPLUS_IMPORT_OR_EXPORT))
	#if defined _WIN32
		#if defined _WIN64
			#define DUIPLUS_CALL __stdcall
		#else
			#define DUIPLUS_CALL
		#endif

		#ifdef DUIPLUS_IMPLEMENTION
			#define DUIPLUS_IMPORT_OR_EXPORT __declspec(dllexport)
		#else
			#define DUIPLUS_IMPORT_OR_EXPORT __declspec(dllimport)
		#endif
#if 0
	#elif defined __ANDROID__
		#define DUIPLUS_CALL
		#define DUIPLUS_IMPORT_OR_EXPORT
		#undef  JNIEXPORT
		#define JNIEXPORT __attribute ((visibility("default")))
#endif
	#elif defined __APPLE__
		#define DUIPLUS_CALL
		#define DUIPLUS_IMPORT_OR_EXPORT
	#elif defined __unix__
		#define DUIPLUS_CALL
		#define DUIPLUS_IMPORT_OR_EXPORT __attribute ((visibility("default")))
	#else
		#define DUIPLUS_CALL
		#define DUIPLUS_IMPORT_OR_EXPORT
	#endif
#endif

#define DUIPLUS_NAME 							"DUIPLUS"
#define DUIPLUS_VERSION							"V1.7.1.w1"
#define DUIPLUS_VERSION_NUM 					171

//TH
#define DUIPLUS_TH_PRODUCT_ID					
#define DUIPLUS_TH_DFU_PRODUCT_ID				769    //0x0301
#define DUIPLUS_TH_DFU_VENDOR_ID				1022   //0x03fe

//th vendor cmd standard types
#define DUIPLUS_VCMD_STANDARD_TYPE_SYS          0x02


//th sys vendor cmd list
#define DUIPLUS_TH_VCMD_DATA_INVLD 				0x00 //no data transfer stage
#define DUIPLUS_TH_VCMD_DATA_VLD 				0x80
#define DUIPLUS_TH_VCMD_DIR_IN 					0x00 //DATA from device to host
#define DUIPLUS_TH_VCMD_DIR_OUT 				0x40 //DATA from host to device

#define DUIPLUS_TH_VCMD_WAKEUP_ENV_SET         	(0x0A|DUIPLUS_TH_VCMD_DATA_VLD|DUIPLUS_TH_VCMD_DIR_OUT) 	//设置唤醒信息
#define DUIPLUS_TH_VCMD_WAKEUP_ENV_GET         	(0x0A|DUIPLUS_TH_VCMD_DATA_VLD|DUIPLUS_TH_VCMD_DIR_IN)  	//获取唤醒阈值
#define DUIPLUS_TH_VCMD_STATUS_SET 				(0x12|DUIPLUS_TH_VCMD_DATA_VLD|DUIPLUS_TH_VCMD_DIR_OUT)  	//设置设备状态，运动/通话
#define DUIPLUS_TH_VCMD_STATUS_GET 				(0x12|DUIPLUS_TH_VCMD_DATA_VLD|DUIPLUS_TH_VCMD_DIR_IN) 		//获取设置状态
#define DUIPLUS_TH_VCMD_FW_VERSION_GET 			(0x14|DUIPLUS_TH_VCMD_DATA_VLD|DUIPLUS_TH_VCMD_DIR_IN) 	   	//获取版本号，字符串


//DUI
#define DUIPLUS_DATA_TYPE_BASE					100	
#define DUIPLUS_DATA_TYPE_JSON					(DUIPLUS_DATA_TYPE_BASE + 1)
#define DUIPLUS_DATA_TYPE_BINARY				(DUIPLUS_DATA_TYPE_BASE + 2)
#define DUIPLUS_DATA_TYPE_THFMT					(DUIPLUS_DATA_TYPE_BASE + 3)
#define DUIPLUS_DATA_TYPE_TLV					(DUIPLUS_DATA_TYPE_BASE + 4)


#define DUIPLUS_EVENT_MSG_BASE					1000	
#define DUIPLUS_EVENT_MSG_INIT					(DUIPLUS_EVENT_MSG_BASE + 1) //@Deprecated, 未使用
#define DUIPLUS_EVENT_MSG_WAKEUP				(DUIPLUS_EVENT_MSG_BASE + 2)
#define DUIPLUS_EVENT_MSG_VAD					(DUIPLUS_EVENT_MSG_BASE + 3)
#define DUIPLUS_EVENT_MSG_ASR					(DUIPLUS_EVENT_MSG_BASE + 4)
#define DUIPLUS_EVENT_MSG_DM_OUTPUT				(DUIPLUS_EVENT_MSG_BASE + 5)
#define DUIPLUS_EVENT_MSG_ERROR					(DUIPLUS_EVENT_MSG_BASE + 6)
#define DUIPLUS_EVENT_MSG_SNR					(DUIPLUS_EVENT_MSG_BASE + 7)
#define DUIPLUS_EVENT_MSG_DOA					(DUIPLUS_EVENT_MSG_BASE + 8)
#define DUIPLUS_EVENT_MSG_BEFORMING				(DUIPLUS_EVENT_MSG_BASE + 9)
#define DUIPLUS_EVENT_MSG_VPR_RUNTIME			(DUIPLUS_EVENT_MSG_BASE + 10)
#define DUIPLUS_EVENT_MSG_RECORD_PCM 			(DUIPLUS_EVENT_MSG_BASE + 11)
#define DUIPLUS_EVENT_MSG_DM_STATUS 			(DUIPLUS_EVENT_MSG_BASE + 12)
#define DUIPLUS_EVENT_MSG_COMMAND_API 			(DUIPLUS_EVENT_MSG_BASE + 13)
#define DUIPLUS_EVENT_MSG_NATIVE_API 			(DUIPLUS_EVENT_MSG_BASE + 14)
#define DUIPLUS_EVENT_MSG_TTS 		 			(DUIPLUS_EVENT_MSG_BASE + 15)
#define DUIPLUS_EVENT_MSG_PLAYER 				(DUIPLUS_EVENT_MSG_BASE + 16)
#define DUIPLUS_EVENT_MSG_VOCABS 				(DUIPLUS_EVENT_MSG_BASE + 17)
#define DUIPLUS_EVENT_MSG_CINFOV2 				(DUIPLUS_EVENT_MSG_BASE + 18)
#define DUIPLUS_EVENT_MSG_TH_ORIGIN 			(DUIPLUS_EVENT_MSG_BASE + 19)
#define DUIPLUS_EVENT_MSG_TH_AEC 				(DUIPLUS_EVENT_MSG_BASE + 20)
#define DUIPLUS_EVENT_MSG_TH_BEAM 				(DUIPLUS_EVENT_MSG_BASE + 21)
#define DUIPLUS_EVENT_MSG_TH_NR 				(DUIPLUS_EVENT_MSG_BASE + 22)
#define DUIPLUS_EVENT_MSG_TH_BEFORMING 			(DUIPLUS_EVENT_MSG_BASE + 23)
#define DUIPLUS_EVENT_MSG_TH_CUSTOM 			(DUIPLUS_EVENT_MSG_BASE + 24)
#define DUIPLUS_EVENT_MSG_TH_PROTOCOL 			(DUIPLUS_EVENT_MSG_BASE + 25)
#define DUIPLUS_EVENT_MSG_TH_OPERATE_INFO 		(DUIPLUS_EVENT_MSG_BASE + 26)
#define DUIPLUS_EVENT_MSG_TH_DOA 				(DUIPLUS_EVENT_MSG_BASE + 27)
#define DUIPLUS_EVENT_MSG_NET_STATUS 			(DUIPLUS_EVENT_MSG_BASE + 28)
#define DUIPLUS_EVENT_MSG_MEDIA 				(DUIPLUS_EVENT_MSG_BASE + 29)
#define DUIPLUS_EVENT_MSG_EXTENDSP_OUTPUT 		(DUIPLUS_EVENT_MSG_BASE + 30)
#define DUIPLUS_EVENT_MSG_OAUTH 				(DUIPLUS_EVENT_MSG_BASE + 31)
#define DUIPLUS_EVENT_MSG_RT_OUTPUT 			(DUIPLUS_EVENT_MSG_BASE + 32)
#define DUIPLUS_EVENT_MSG_SENTENCE	 			(DUIPLUS_EVENT_MSG_BASE + 33)
#define DUIPLUS_EVENT_MSG_EVALUATE_KWS	 		(DUIPLUS_EVENT_MSG_BASE + 34)
#define DUIPLUS_EVENT_MSG_FACE_RESULT			(DUIPLUS_EVENT_MSG_BASE + 35)
#define DUIPLUS_EVENT_MSG_ONESHOT_TIMEOUT		(DUIPLUS_EVENT_MSG_BASE + 36) ////@Deprecated
#define DUIPLUS_EVENT_MSG_MULTIREGION_ASR_OUTPUT 	(DUIPLUS_EVENT_MSG_BASE + 37)
#define DUIPLUS_EVENT_MSG_VPR_REGISTER 			(DUIPLUS_EVENT_MSG_BASE + 38)
#define DUIPLUS_EVENT_MSG_VPR_UNREGISTER 		(DUIPLUS_EVENT_MSG_BASE + 39)
#define DUIPLUS_EVENT_MSG_VPR_VERIFY 			(DUIPLUS_EVENT_MSG_BASE + 40)
#define DUIPLUS_EVENT_MSG_VPR_ASR 				(DUIPLUS_EVENT_MSG_BASE + 41)
#define DUIPLUS_EVENT_MSG_SNR_SILENCE			(DUIPLUS_EVENT_MSG_BASE + 42)
#define DUIPLUS_EVENT_MSG_SNR_VOICE				(DUIPLUS_EVENT_MSG_BASE + 43)
#define DUIPLUS_EVENT_MSG_SECONDARY_TIMEOUT		(DUIPLUS_EVENT_MSG_BASE + 44)
#define DUIPLUS_EVENT_MSG_DISPLAY				(DUIPLUS_EVENT_MSG_BASE + 45)
#define DUIPLUS_EVENT_MSG_ASR_RAW				(DUIPLUS_EVENT_MSG_BASE + 46)
#define DUIPLUS_EVENT_MSG_NATIVE_API_RAW		(DUIPLUS_EVENT_MSG_BASE + 47)
#define DUIPLUS_EVENT_MSG_DDS_SOCKET_STATUS		(DUIPLUS_EVENT_MSG_BASE + 48)
#define DUIPLUS_EVENT_MSG_TTS_PHONE				(DUIPLUS_EVENT_MSG_BASE + 49)
#define DUIPLUS_EVENT_MSG_NWAKEUP 				(DUIPLUS_EVENT_MSG_BASE + 50)
#define DUIPLUS_EVENT_MSG_MULTIREGION_VAD_OUTPUT 	(DUIPLUS_EVENT_MSG_BASE + 51)
#define DUIPLUS_EVENT_MSG_ALWAYS_DIALOG		 	(DUIPLUS_EVENT_MSG_BASE + 52)
#define DUIPLUS_EVENT_MSG_MULTIREGION_OUTPUT 	(DUIPLUS_EVENT_MSG_BASE + 53) //@Deprecated, 未使用
#define DUIPLUS_EVENT_MSG_GET_TTS 		 		(DUIPLUS_EVENT_MSG_BASE + 54)
#define DUIPLUS_EVENT_MSG_HOTWORD_RESULT		(DUIPLUS_EVENT_MSG_BASE + 55)
#define DUIPLUS_EVENT_MSG_TED_POS_RESULT		(DUIPLUS_EVENT_MSG_BASE + 56)
#define DUIPLUS_EVENT_MSG_DOUBLE_VAD_OUTPUT		(DUIPLUS_EVENT_MSG_BASE + 57)
#define DUIPLUS_EVENT_MSG_LITE_MDS				(DUIPLUS_EVENT_MSG_BASE + 58)
#define DUIPLUS_EVENT_MSG_LITE_SSPE_WAKEUP		(DUIPLUS_EVENT_MSG_BASE + 59)
#define DUIPLUS_EVENT_MSG_LITE_SSPE_DOA			(DUIPLUS_EVENT_MSG_BASE + 60)
#define DUIPLUS_EVENT_MSG_LITE_SSPE_BEFORMING	(DUIPLUS_EVENT_MSG_BASE + 61)
#define DUIPLUS_EVENT_MSG_LITE_SSPE_AEC			(DUIPLUS_EVENT_MSG_BASE + 62)
#define DUIPLUS_EVENT_MSG_LITE_SSPE_OUTPUT		(DUIPLUS_EVENT_MSG_BASE + 63)
#define DUIPLUS_EVENT_MSG_LITE_SSPE_GET_INFO	(DUIPLUS_EVENT_MSG_BASE + 64)
#define DUIPLUS_EVENT_MSG_LOCAL_VPR_REGISTER	(DUIPLUS_EVENT_MSG_BASE + 65)
#define DUIPLUS_EVENT_MSG_LOCAL_VPR_UNREGISTER	(DUIPLUS_EVENT_MSG_BASE + 66)
#define DUIPLUS_EVENT_MSG_LOCAL_VPR_APPEND		(DUIPLUS_EVENT_MSG_BASE + 67)
#define DUIPLUS_EVENT_MSG_LOCAL_VPR_QUERY		(DUIPLUS_EVENT_MSG_BASE + 68)
#define DUIPLUS_EVENT_MSG_LOCAL_VPR_UPDATE		(DUIPLUS_EVENT_MSG_BASE + 69)
#define DUIPLUS_EVENT_MSG_LOCAL_VPR_TEST		(DUIPLUS_EVENT_MSG_BASE + 70)
#define DUIPLUS_EVENT_MSG_HOTWORD_NLU_PARAMS	(DUIPLUS_EVENT_MSG_BASE + 71)
#define DUIPLUS_EVENT_MSG_LITE_SSPE_COMMON_DOA	(DUIPLUS_EVENT_MSG_BASE + 72)
#define DUIPLUS_EVENT_MSG_LITE_SSPE_WKP_AUDIO 	(DUIPLUS_EVENT_MSG_BASE + 73)
#define DUIPLUS_EVENT_MSG_LITE_SSPE_VAD_AUDIO	(DUIPLUS_EVENT_MSG_BASE + 74)
#define DUIPLUS_EVENT_MSG_LITE_SSPE_ASR_AUDIO	(DUIPLUS_EVENT_MSG_BASE + 75)
#define DUIPLUS_EVENT_MSG_LITE_SSPE_DOA_AUDIO	(DUIPLUS_EVENT_MSG_BASE + 76)
#define DUIPLUS_EVENT_MSG_COST_RESULT		    (DUIPLUS_EVENT_MSG_BASE + 77)
#define DUIPLUS_EVENT_MSG_EXTRA_AEC		    	(DUIPLUS_EVENT_MSG_BASE + 78)
#define DUIPLUS_EVENT_MSG_EXTRA_OUTPUT		    (DUIPLUS_EVENT_MSG_BASE + 79)
#define DUIPLUS_EVENT_MSG_EXTRA_BEFORMING		(DUIPLUS_EVENT_MSG_BASE + 80)
#define DUIPLUS_EVENT_MSG_LITE_WAKEUP			(DUIPLUS_EVENT_MSG_BASE + 81)
#define DUIPLUS_EVENT_MSG_LITE_GRAM				(DUIPLUS_EVENT_MSG_BASE + 82)
#define DUIPLUS_EVENT_MSG_LITE_VAD				(DUIPLUS_EVENT_MSG_BASE + 83)
#define DUIPLUS_EVENT_MSG_LITE_ASR				(DUIPLUS_EVENT_MSG_BASE + 84)
#define DUIPLUS_EVENT_MSG_LITE_TTS				(DUIPLUS_EVENT_MSG_BASE + 85)
#define DUIPLUS_EVENT_MSG_LITE_ASRPP			(DUIPLUS_EVENT_MSG_BASE + 86)
#define DUIPLUS_EVENT_MSG_OAD_RESULT			(DUIPLUS_EVENT_MSG_BASE + 87)
#define DUIPLUS_EVENT_MSG_MERGE_VAD 		    (DUIPLUS_EVENT_MSG_BASE + 88)
#define DUIPLUS_EVENT_MSG_MERGE_TED      		(DUIPLUS_EVENT_MSG_BASE + 89)
#define DUIPLUS_EVENT_MSG_VAD_TIMEOUT 			(DUIPLUS_EVENT_MSG_BASE + 90)
#define DUIPLUS_EVENT_MSG_ONLYSSPE_WKPDOAPCM 	(DUIPLUS_EVENT_MSG_BASE + 91)
#define DUIPLUS_EVENT_MSG_GET_INFO 				(DUIPLUS_EVENT_MSG_BASE + 92)
#define DUIPLUS_EVENT_MSG_UPDATE_RESULT 		(DUIPLUS_EVENT_MSG_BASE + 93)
#define DUIPLUS_EVENT_MSG_LITE_MDS_NOTIFY 		(DUIPLUS_EVENT_MSG_BASE + 94)
#define DUIPLUS_EVENT_MSG_LITE_SSPE_NOTIFY 		(DUIPLUS_EVENT_MSG_BASE + 95)
#define DUIPLUS_EVENT_MSG_LITE_WAKEUP_NOTIFY 	(DUIPLUS_EVENT_MSG_BASE + 96)
#define DUIPLUS_EVENT_MSG_LITE_VAD_NOTIFY 		(DUIPLUS_EVENT_MSG_BASE + 97)
#define DUIPLUS_EVENT_MSG_LITE_ASR_NOTIFY 		(DUIPLUS_EVENT_MSG_BASE + 98)
#define DUIPLUS_EVENT_MSG_LITE_TTS_NOTIFY 		(DUIPLUS_EVENT_MSG_BASE + 99)
#define DUIPLUS_EVENT_MSG_LITE_NWAKEUP  		(DUIPLUS_EVENT_MSG_BASE + 100)
#define DUIPLUS_EVENT_MSG_LITE_NWAKEUP_NOTIFY 	(DUIPLUS_EVENT_MSG_BASE + 101)
#define DUIPLUS_EVENT_MSG_ONESHOT  				(DUIPLUS_EVENT_MSG_BASE + 102)


struct MQBus_t;
struct duiNode_t;

/*
return must malloc|NULL
*/
typedef char* (*duiPlusCallBack)(void *userdata, char * data, int len, int type, int event);

typedef char* (*duiPlusLiteCallBack)(void *userdata, int engineIndex, char * data, int len, int type, int event);

struct duiPlus_t
{
	struct MQBus_t * busManager;
	struct duiNode_t * nodes; //duiPlus all node
	duiPlusCallBack handler;
	void * userdata;
};

/*非线程安全*/
DUIPLUS_IMPORT_OR_EXPORT char * DUIPLUS_CALL duiPlusGetVersion(char * params);

/*
	{
		\"level\":2, 
		\"productId\": \"278570028\",
	    \"savedProfile\": \"./res/auth/278570028.txt\",
	    \"logDirPath\":\".\",
	    \"productVersion\": \"0.1.2\",
    }
*/
/*非线程安全*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusDoAuth(char * cfg);

/*
"{
	\"micType\":4,  //预留, beforming.pcm, 根据通道数，vad模块定于音频数据类型
	\"aec\":\"false\",  //预留, sspe 模块，是否使用AEC, 若未使用，语音播报时，语音逻辑关闭唤醒
    \"deviceId\":\"xxx\",
	\"wakeup\":{
		\"resBinPath\":\"xxxx\",
#ifdef USE_SSPE
		\"wakeupBinPath\":\"xxxxx\",
		\"sspeBinPath\":\"\",
#endif
		\"env\": \"words=ni hao xiao chi;thresh=0.127;major=1;\",
		\"word\":\"你好小驰\"
	},
	\"vad\":{
		\"resBinPath\":\"xxxx\",
		\"pauseTime\":300
	},
	\"gram\":{
		\"resBinPath\":\"xxxxx\",
		\"outputPath\":\"xxxx.net.bin\",
		\"ebnf\":\"xxxxx.xbnf\"
	},
	\"asr\":{
		\"resBinPath\":\"xxxxx\",
		\"netBinPath\":\"xxxx.net.bin\"
	},
	\"cntts\":{
		\"frontBinPath\": \"res_file_path\",
		\"backBinPath\": \"res_file_path\",
		\"dictPath\": \"res_file_path\"
	},
	\"recorder\":{
		\"devName\":\"default\",
		\"channels\":1,
		\"sampleBits\": 16,
		\"sampleRate\":16000
	},
	\"player\":{
		\"multiplier\":2
	},
	\"uplaod\":{
		\"logId\": 1,                             //必选，dds=>231， duilite=>141,特殊需求需要向大数据申请
       	\"cacheSize\": 100,						   //默认缓存20条数据（包括json和file）
		\"retryTimes\": 3,						   //上传失败重试次数
       	\"uploadMode\":false						//可选，初始化自动阻塞获取上传模式,默认true
	}
}"
handle, 禁用耗时操作，防止阻塞BUS,sample_rate, int channels, int sample_bits
return manage, 仅支持创建一个实例
非线程安全
*/
DUIPLUS_IMPORT_OR_EXPORT struct duiPlus_t * DUIPLUS_CALL duiPlusNew(char * params, duiPlusCallBack handler, void * userdata);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusRegisterCallback(char *cfg, void *userdata, duiPlusCallBack callback);

/*
"[{\"wakeupWords\":\"\", \"pinyin\":\"\", \"thresh\":\"0.127\", \"greeting\":\"\", \"type\":\"main\"},{\"wakeupWords\":\"\", \"pinyin\":\"ni hao xiao le \", \"thresh\":\"0.127\", \"greeting\":\"\", \"type\":\"command\"}]"
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusSetWakeupWords(struct duiPlus_t * duiPlus, char* params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusEnableWakeup(struct duiPlus_t * duiPlus);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusDisableWakeup(struct duiPlus_t * duiPlus);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusEvaluateKeyWords(struct duiPlus_t * duiPlus, char* params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusEnableAlwaysDialog(struct duiPlus_t *duiPlus, char* params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusDisableAlwaysDialog(struct duiPlus_t *duiPlus, char* params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusEnableAdvancedOneshot(struct duiPlus_t *duiPlus, char* params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusDisableAdvancedOneshot(struct duiPlus_t *duiPlus, char* params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusSetWkpInterruptDialogue(struct duiPlus_t *duiPlus, char *params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusUpdateHotWords(struct duiPlus_t *duiPlus, char* params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStartHotWords(struct duiPlus_t *duiPlus, char* params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStopHotWords(struct duiPlus_t *duiPlus, char* params);
/*"[{\"nlg\":\"\", \"path\":\"xxxx/xxx.wav\", \"type\":\"wav\"}, {}]"*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusSetCustomAudio(struct duiPlus_t * duiPlus, char* params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStartListening(struct duiPlus_t * duiPlus);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStopListening(struct duiPlus_t * duiPlus);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStartDialog(struct duiPlus_t * duiPlus);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStopDialog(struct duiPlus_t * duiPlus); //@Deprecated

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStopDialogParams(struct duiPlus_t * duiPlus, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusFeedData(struct duiPlus_t * duiPlus, char * data, int len);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusInputText(struct duiPlus_t * duiPlus, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusTriggerIntent(struct duiPlus_t * duiPlus, char * params);

/*在线全双工专有*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusSetContextSync(struct duiPlus_t * duiPlus, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusSpeak(struct duiPlus_t * duiPlus, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusSetParams(struct duiPlus_t * duiPlus, char* params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusGetParams(struct duiPlus_t * duiPlus, char* params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusOperateVocabs(struct duiPlus_t * duiPlus, char* params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusSystemSettings(struct duiPlus_t * duiPlus, char* params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusSkillSettings(struct duiPlus_t * duiPlus, char* params);

/*
只有内部播放器，才能使用；  喂数据开始调用
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusFeedCustomTTSDataBegin(struct duiPlus_t * duiPlus, char* params);
/*
只有内部播放器，才能使用； 在合成NLG完成之后，调用该接口送PCM, 接着播放
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusFeedCustomTTSData(struct duiPlus_t * duiPlus, char* data, int len);
/*
只有内部播放器，才能使用, 喂数据结束调用
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusFeedCustomTTSDataEnd(struct duiPlus_t * duiPlus, char* params);

/*
只有外部播放器，才能使用；外部播放完成之后调用该接口, params，预留，传NULL
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusNotifyTTSEnd(struct duiPlus_t * duiPlus, char* params);

/* 暂不支持
	"{
		\"operation\":\"set\", 
		\"oauthParams\":{
			\"refreshTokenFile\": \"./test/refresh_token.txt\", 
			\"clientId\": \"xxxx\",
			\"userId\":\"xxxx\",
			\"codeVerifier\":\"xxxx\",
			\"authCode\":\"xxxx\"
		}
	}"
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusOperateOauth(struct duiPlus_t * duiPlus, char* params);

/*
mode : cloud ==>在线模式, local==>离线模式, internal==>先在线请求，2秒超时后离线
{
	"mode":"cloud"
}
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusSetDialogPolicy(struct duiPlus_t * duiPlus, char* params);


/*
mode : cloud ==>在线模式, local==>离线模式, internal==>有网请求，无网络离线
{
	"mode":"cloud"
}
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusSetTtsPolicy(struct duiPlus_t * duiPlus, char* params);


/*
find device usb(download/dfu) node
@ params {"THPid":xxx, "THVid":xxx}
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusTHFindDevice(struct duiPlus_t * duiPlus, char* params);

/*
device must have flash, 第一次使用DFU 升级， 然后使用download升级
@duiPlus instance
@parasm NULL
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusTHDownload(struct duiPlus_t * duiPlus, char* params);

/*
device  not have flash, 使用DFU 升级
@duiPlus instance
@parasm NULL
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusTHDFU(struct duiPlus_t * duiPlus, char* params);

/*
must have flash, 从download 切换到DFU模式, debug DFU
@duiPlus instance
@parasm NULL
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusTHDownloadToDFU(struct duiPlus_t * duiPlus, char* params);


/*
@duiPlus instance
@parasm NULL
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusTHReset(struct duiPlus_t * duiPlus, char* params);

/*
逐条请求，得到结果；再请求下一次
@return 
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusTHOperateInfo(struct duiPlus_t * duiPlus, char* params);

// /*"[{\"input\":\"xxxxx\", \"pinyin\":\"", \"nlg\":\"xxxxx\",\"action\":\"\"}, {\"input\":\"xxxxx\", \"pinyin\":\"", \"nlg\":\"xxxxx\",\"action\":\"\"}]"*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusTHSetCustomNlg(struct duiPlus_t * duiPlus, char* params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStartExtendsp(struct duiPlus_t * duiPlus);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusFeedExtendsp(struct duiPlus_t * duiPlus, char* data, int len); //

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStopExtendsp(struct duiPlus_t * duiPlus);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStartFace(struct duiPlus_t * duiPlus, char *params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusFeedImage(struct duiPlus_t * duiPlus, char *imgData, int imgLen, int imgWidth, int imgHeight, int imgColorMode);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusFeedOadImage(struct duiPlus_t * duiPlus, char *imgData, int imgLen, int imgWidth, int imgHeight, int imgMode);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStopFace(struct duiPlus_t * duiPlus, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusCloudVprRegister(struct duiPlus_t * duiPlus, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusCloudVprUnregister(struct duiPlus_t * duiPlus, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusCloudVprVerify(struct duiPlus_t * duiPlus, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusWakeupVprStart(struct duiPlus_t * duiPlus, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusWakeupVprFeed(struct duiPlus_t * duiPlus, char *params, int type, char * data, int len);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusWakeupVprStop(struct duiPlus_t * duiPlus, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusWakeupVprQuery(struct duiPlus_t * duiPlus, char *params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusWakeupVprRemove(struct duiPlus_t * duiPlus, char *params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusPublish(struct duiPlus_t * duiPlus, char * topic, char * data, int len);

DUIPLUS_IMPORT_OR_EXPORT char * DUIPLUS_CALL duiPlusCall(struct duiPlus_t * duiPlus, char * url, char * data, int len);

/*
接口同步
@param duiPlus 	实例
@param cfg     	创建mds需要的配置资源信息（json格式）
@param handler 	回调
@param userdata 用户数据
@return index   返回该单项技术的索引，从0开始，默认0-2 | -1 失败
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusCreateMdsIndex(struct duiPlus_t * duiPlus, char * cfg, duiPlusLiteCallBack handler, void* userdata);

/*
接口异步
@param duiPlus 实例
@param index   mds索引
@param params  预留
@return 0|1     0 传参成功|非0 传参失败
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStartMds(struct duiPlus_t * duiPlus, int index,  char * params);

/*
接口异步
@param duiPlus 实例
@param index   mds索引
@param data    音频数据（binary）
@param len     音频数据长度
@param params  预留
@return 0|1     0 传参成功|非0 传参失败
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusFeedMds(struct duiPlus_t * duiPlus, int index,  char * data, int len, char * params);

/*
接口异步, 回调给出结果,必须之调用start, feed 反之忽略
@param duiPlus 实例
@param index   mds索引
@param params  预留 
@return 0|1     0 传参成功|非0 传参失败
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStopMds(struct duiPlus_t * duiPlus, int index, char * params);

/*
接口异步
@param duiPlus 实例
@param index   mds索引
@param params  参数示例: 
	mds 算法返回三个 snr 值，分别为”snrLF””snrHF” ”snr”,。以2个设备为
	例详细阐述该决策接口的使用方法：
	记 dev1 设备返回（snrLF1，snrHF1，snr1）
	记 dev2 设备返回（snrLF2，snrHF2，snr2）
	则snrlist列表先是LF(按设备顺序), 然后HF(按设备顺序), 最后snr(按设备顺序), 例如:	
	{
		"snrlist":[
			snrLF1,
			snrLF2,
			snrHF1,
			snrHF2,
			snr1,
			snr2
		],
		"devCount": 2
	}

@return 0|1     0 传参成功|非0 传参失败
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusDecisionMds(struct duiPlus_t * duiPlus, int index, char * params);

/*
接口异步
@param duiPlus 实例
@param index   mds索引
@param params  设置相关参数
@return 0|1     0 传参成功|非0 传参失败
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusSetMdsParams(struct duiPlus_t * duiPlus, int index, char * params);

/*
接口同步
@param duiPlus 实例
@param index   vad索引
@param params  预留
@return 0|1     0 传参成功|非0 传参失败
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusReleaseMdsIndex(struct duiPlus_t * duiPlus, int index, char * params);


/*
单项技术信号处理,接口同步
@param duiPlus 	实例
@param cfg     	创建sspe需要的配置资源信息（json格式）
@param handler 	回调
@param userdata 用户数据
@return index   返回该单项技术的索引，从0开始，默认0-2 | -1 失败
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusCreateSspeIndex(struct duiPlus_t * duiPlus, char * cfg, duiPlusLiteCallBack handler, void* userdata);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStartSspe(struct duiPlus_t * duiPlus, int index,  char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusFeedSspe(struct duiPlus_t * duiPlus, int index,  char * data, int len, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStopSspe(struct duiPlus_t * duiPlus, int index, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusSetSspeParams(struct duiPlus_t * duiPlus, int index, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusGetSspeParams(struct duiPlus_t * duiPlus, int index, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusReleaseSspeIndex(struct duiPlus_t * duiPlus, int index, char * params);

/*
单项技术信号处理,接口同步
@param duiPlus 	实例
@param cfg     	创建sspe需要的配置资源信息（json格式）
@param handler 	回调
@param userdata 用户数据
@return index   返回该单项技术的索引，从0开始，默认0-2 | -1 失败
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusCreateWakeupIndex(struct duiPlus_t * duiPlus, char * cfg, duiPlusLiteCallBack handler, void* userdata);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStartWakeup(struct duiPlus_t * duiPlus, int index,  char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusFeedWakeup(struct duiPlus_t * duiPlus, int index,  char * data, int len, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStopWakeup(struct duiPlus_t * duiPlus, int index, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusSetWakeupParams(struct duiPlus_t * duiPlus, int index, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusReleaseWakeupIndex(struct duiPlus_t * duiPlus, int index, char * params);

/*
单项技术信号处理,接口同步
@param duiPlus 	实例
@param cfg     	创建gram需要的配置资源信息（json格式）
@param handler 	回调
@param userdata 用户数据
@return index   返回该单项技术的索引，从0开始，默认0-2 | -1 失败
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusCreateGramIndex(struct duiPlus_t * duiPlus, char * cfg, duiPlusLiteCallBack handler, void* userdata);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStartGram(struct duiPlus_t * duiPlus, int index,  char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusSetGramParams(struct duiPlus_t * duiPlus, int index, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusReleaseGramIndex(struct duiPlus_t * duiPlus, int index, char * params);

/*
单项技术语音VAD,接口同步
@param duiPlus 	实例
@param cfg     	创建vad需要的配置资源信息（json格式）
@param handler 	回调
@param userdata 用户数据
@return index   返回该单项技术的索引，从0开始，默认0-2 | -1 失败
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusCreateVadIndex(struct duiPlus_t * duiPlus, char * cfg, duiPlusLiteCallBack handler, void* userdata);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStartVad(struct duiPlus_t * duiPlus, int index,  char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusFeedVad(struct duiPlus_t * duiPlus, int index,  char * data, int len, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStopVad(struct duiPlus_t * duiPlus, int index, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusSetVadParams(struct duiPlus_t * duiPlus, int index, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusReleaseVadIndex(struct duiPlus_t * duiPlus, int index, char * params);


/*
单项技术语音ASR,接口同步
@param duiPlus 	实例
@param cfg     	创建asr需要的配置资源信息（json格式）
@param handler 	回调
@param userdata 用户数据
@return index   返回该单项技术的索引，从0开始，默认0-2 | -1 失败
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusCreateAsrIndex(struct duiPlus_t * duiPlus, char * cfg, duiPlusLiteCallBack handler, void* userdata);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStartAsr(struct duiPlus_t * duiPlus, int index,  char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusFeedAsr(struct duiPlus_t * duiPlus, int index,  char * data, int len, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStopAsr(struct duiPlus_t * duiPlus, int index, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusSetAsrParams(struct duiPlus_t * duiPlus, int index, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusReleaseAsrIndex(struct duiPlus_t * duiPlus, int index, char * params);


/*
单项技术语音CNTTS,接口同步
@param duiPlus 	实例
@param cfg     	创建asr需要的配置资源信息（json格式）
@param handler 	回调
@param userdata 用户数据
@return index   返回该单项技术的索引，从0开始，默认0-2 | -1 失败
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusCreateCnttsIndex(struct duiPlus_t * duiPlus, char * cfg, duiPlusLiteCallBack handler, void* userdata);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStartCntts(struct duiPlus_t * duiPlus, int index,  char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusFeedCntts(struct duiPlus_t * duiPlus, int index,  char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStopCntts(struct duiPlus_t * duiPlus, int index, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusSetCnttsParams(struct duiPlus_t * duiPlus, int index, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusReleaseCnttsIndex(struct duiPlus_t * duiPlus, int index, char * params);


/*
单项技术语音NWAKEUP,接口同步
@param duiPlus 	实例
@param cfg     	创建asr需要的配置资源信息（json格式）
@param handler 	回调
@param userdata 用户数据
@return index   返回该单项技术的索引，从0开始，默认0-2 | -1 失败
*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusCreateNwakeupIndex(struct duiPlus_t * duiPlus, char * cfg, duiPlusLiteCallBack handler, void* userdata);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStartNwakeup(struct duiPlus_t * duiPlus, int index,  char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusFeedNwakeup(struct duiPlus_t * duiPlus, int index,  char* data, int len, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusStopNwakeup(struct duiPlus_t * duiPlus, int index, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusSetNwakeupParams(struct duiPlus_t * duiPlus, int index, char * params);

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusReleaseNwakeupIndex(struct duiPlus_t * duiPlus, int index, char * params);

/*
duiPlus: instance
params : {"size":1024}
return memory point
*/
DUIPLUS_IMPORT_OR_EXPORT char * DUIPLUS_CALL duiPlusMalloc(struct duiPlus_t * duiPlus, char * params); //兼容C#申请内存

DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusFree(struct duiPlus_t * duiPlus, char *output); //兼容C# 释放内存

/*非线程安全*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusDelete(struct duiPlus_t * duiPlus);

/*非线程安全*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusReleaseAuth();

/*非线程安全*/
DUIPLUS_IMPORT_OR_EXPORT int DUIPLUS_CALL duiPlusReleaseVersion(char * params);

#ifdef __cplusplus
}
#endif
#endif
